#ifndef CLIQUETREE_HEADER
#define CLIQUETREE_HEADER

#include <list>
#include <assert.h>
#include <iostream>
#include "Clique.h"
#include "Arbol.h"
#include "grafo.h"


using namespace std;

typedef Arbol<Clique>::Nodo Nodo;
typedef pair< int, Nodo* > Par;

class CliqueTree
{
	public:
		CliqueTree(Grafo g, unsigned int cantidadNodos, list<int>* r, list<int>* h, list<int> np, vector<int>& ord);
		~CliqueTree();
		void armarArbolDeCliques();
		void armarCoArbolDeCliques();

	private:
    void nodosRaiz();
    void setearNodosRaiz(bool* tienePadre);
    void setearNoPadres(list<int> np);
    void crearOrdenNodos(vector<int> &orden);
    void apilarHijos(list<Par>& lista, int v, Nodo& n);
    bool esIgual(list<int>& rn, Clique& c);
    bool esIgual(int noPadre, list<int>& rn, list<int>& rnp);
    void pegarNoVecinos(int x, Clique* c);


    unsigned int cantNodos;
    Grafo grafo;
    list<int>* rns;
    list<int>* hijos;
    list<int>* raices;
    int* noPadres;
    int* ordenNodos;
    vector<int> orden;
    bool* chequeador;
};


#endif // CLIQUETREE_HEADER

